package com.ts.enterprise.enums;


import com.ts.enterprise.common.utils.SpringContextUtil;
import lombok.extern.slf4j.Slf4j;

import java.util.Calendar;

/**
 * redis Key的前缀和超时时间.
 *
 * @author dean
 */
@Slf4j
public enum RedisKeyEnum {
    /**
     * 一次请求的唯一标识 60s 过期
     */
    NONCE("nonce:", 60),
    /**
     * 禁用用户，-1代表永久
     */
    FORBIDDEN_USER("forbid_user:", -1),
    /**
     * 权限字符串
     */
    PERM_CODE("perm_code:", 24 * 60 * 60),
    /**
     * token时间切面用
     */
    TOKEN_AOP_EXPIRATION_TIME("token_aop_expiration_time", 5 * 60),
    /**
     * 手机验证码
     */
    SMS_CODE("sms_code", 5 * 60),
    /**
     * 阿里云短信验证码
     */
    SMS_STS("SMS_CODE", 5 * 60),
    /**
     * 阿里云APP osstoken
     */
    OSS_APP_STS_TOKEN("OSS_APP_STS_TOKEN", 60 * 50),
    /**
     * 阿里云APP 带sign osstoken
     */
    OSS_APP_STS_TOKEN_WITH_SIGN("oss_app_sts_token_with_sign", 60 * 50),
    /**
     * 商品sku缓存
     */
    GOODS_SKU("GOODS_SKU:", 60 * 60),
    /**
     * 取消订单锁
     */
    JOB_CANCEL_ORDER_LOCK("job_cancel_order_lock:"),
    /**
     * 自动同意仅退款申请
     */
    JOB_AGREE_REFUND_LOCK("job_agree_refund_lock:"),
    /**
     * 重启后自动同意仅退款申请锁
     */
    RESTART_JOB_AGREE_REFUND_LOCK("restart_job_agree_refund_lock:"),
    /**
     * 重启后取消订单锁
     */
    RESTART_CANCEL_ORDER_COURSE_LOCK("restart_cancel_order_course_lock:"),
    /**
     * 订单支付outTradeNo 2s不可再次支付
     */
    ORDER_PAY_OUT_TRADE_NO_LOCK("order_pay_out_trade_no_lock:",2),
    /**
     * 多服务启动创建默认管理员锁
     */
    START_CREATE_DEFAULT_ADMIN_USER_LOCK("start_create_default_admin_user_lock"),
    /**
     * 多服务启动负载本月基本工资锁
     */
    OTHER_SALARY_NOW_MONTH_LOCK("other_salary_now_month_lock"),
    /**
     * 初始化企业锁
     */
    COMPANY_CREATE_DEFAULT_LOCK("company_create_default_lock:"),
    /**
     * 保存职位锁
     */
    SAVE_USER_ROLE_DEFAULT_LOCK("save_user_role_default_lock:"),
    /**
     * 多服务启动负载初始化打卡记录
     */
    INIT_TODAY_ATTEND_RECORD_LOCK("init_today_attend_record_lock"),
    /**
     * 多服务启动负载每晚统计打卡记录
     */
    STATISTICS_DAY_ATTEND_RECORD_LOCK("statistics_day_attend_record_lock"),
    /**
     * 租户分扎锁
     */
    BATCH_INFO_ADD_LIST_LOCK("batch_info_add_list_lock:"),
    /**
     * 多服务启动负载初始化模块销售
     */
    INIT_ALL_MODULE_SALE_LOCK("init_all_module_sale_lock"),
    /**
     * 法定节假日缓存
     */
    HOLIDAYS_DATE("holidays_date"),
    /**
     * 字典缓存
     */
    T_DICT_CACHE("t_dict_cache", 60 * 10),

    ;


    private String prefix;
    private int expiredTime;

    RedisKeyEnum(String prefix) {
        this.prefix = prefix;
    }

    RedisKeyEnum(String prefix, int expiredTime) {
        this.prefix = prefix;
        this.expiredTime = expiredTime;
    }

    /**
     * 设置运行环境前缀
     */

    public String getPrefixWithActive() {
        return SpringContextUtil.getActiveProfile() + ":" + prefix;
    }

    public String getPrefix() {
        return prefix;
    }

    public int getExpiredTime() {
        return expiredTime;
    }

    public static String getRedisKey(RedisKeyEnum redisKeyEnum, String value) {
        return redisKeyEnum.getPrefix() + ":" + value;
    }

    /**
     * 判断当前时间距离第二天凌晨的秒数
     *
     * @return 返回值单位为[s:秒]
     */
    public static Long getSecondsNextEarlyMorning() {
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.DAY_OF_YEAR, 1);
        cal.set(Calendar.HOUR_OF_DAY, 0);
        cal.set(Calendar.SECOND, 0);
        cal.set(Calendar.MINUTE, 0);
        cal.set(Calendar.MILLISECOND, 0);
        return (cal.getTimeInMillis() - System.currentTimeMillis()) / 1000;
    }
}
